package com.xwintop.xJavaFxTool;

import com.baidu.aip.ocr.AipOcr;
import com.xwintop.xJavaFxTool.services.littleTools.ImageToolService;
import javafx.application.Application;
import lombok.extern.slf4j.Slf4j;
import org.json.JSONArray;
import org.json.JSONObject;

import java.io.*;
import java.util.*;

@Slf4j
public class ImageToolMain {
    //原始图片ui界面
//    public static void main(String[] args) {
//        Application.launch(ImageToolApplication.class, args);
//    }

    /**
     *
     *
     *
     * 上传资源的时候   图片从目标 的目录中取 targeturl
     * @param args
     * @throws Exception
     */
   public static void main(String[] args) throws Exception{
       /**
        * 操作流程：
        * 保存图片  截图的时候  都放到tmp文件中  等截图完成后  执行main方法
        *
        * main方法执行完成后。  识别的文字在wenben.txt中， 图片在目标中
        */
       String tmp  = "C:\\Users\\Administrator\\Desktop\\source\\tmp\\"; // 统一保存图片路径文件夹
       String picImgurl  = "C:\\Users\\Administrator\\Desktop\\source\\资源图片\\"; // 源文件夹
       String textImgUrl = "C:\\Users\\Administrator\\Desktop\\source\\weixin\\";  // 存储需要识别文本的图片文件夹
       String targeturl = "C:\\Users\\Administrator\\Desktop\\source\\目标\\";//压缩完图片目标路径--最后上传从这里取
       String wenbentext="C:\\Users\\Administrator\\Desktop\\source\\wenben.txt";//识别完  文本名称

       changImg(tmp,picImgurl,textImgUrl);
       picYaSuo(picImgurl,targeturl);
       picTextOcr(textImgUrl,wenbentext);
    }

    /**
     *      将文件夹 里文件进行拆分  鉴于截图文件是以png结尾，
     *      * 保存图片以jpg结尾。因此  保存的时候都保存在tmp文件中，之后执行该方法进行移走
     * @param tmp
     * @param picImgurl
     * @param textImgUrl
     * @throws Exception
     */
    public static void changImg( String tmp , String picImgurl, String textImgUrl  ) throws Exception {


        //第一步 将生成的  识别文本文件夹及保存图片文件夹  内的历史数据清空
        File[] picImgurlFile = (new File(picImgurl)).listFiles(); // 获取源文件夹当前下的文件或目录
        File[] textImgUrlFile = (new File(textImgUrl)).listFiles(); // 获取源文件夹当前下的文件或目录
        for (int i = 0; i < picImgurlFile.length; i++)
        {
            deleteFile(picImgurlFile[i]);
        }
        for (int i = 0; i < textImgUrlFile.length; i++)
        {
            deleteFile(textImgUrlFile[i]);
        }

        File[] beforFile = (new File(tmp)).listFiles(); // 获取源文件夹当前下的文件或目录
        for (int i = 0; i < beforFile.length; i++)
        {
            if (beforFile[i].isFile()) // 复制文件
            {
                String filename= beforFile[i].getName();

                if (filename.endsWith("jpg")){//表示是保存的图片
                    copyFile(beforFile[i], new File(picImgurl +filename));
                }else {
                    //需要识别的图片
                    copyFile(beforFile[i],new File(textImgUrl +filename));
                }

            }
        }
        //清空文件
        for (int i = 0; i < beforFile.length; i++)
        {
            deleteFile(beforFile[i]);
        }

        System.out.println("-----changImg--结束--------");
    }

    /**
     * 1.先产生缩略图
     * 2.图片压缩
     * @param sourceurl "C:\\Users\\Administrator\\Desktop\\source\\资源图片\\"
     * @param targeturl  "C:\\Users\\Administrator\\Desktop\\source\\目标\\"
     * @throws Exception
     */
    public static void picYaSuo(  String sourceurl,  String targeturl) throws Exception {
        //第一步先将目标文件清空
        File[] targeturlFile = (new File(targeturl)).listFiles(); //
        for (int i = 0; i < targeturlFile.length; i++)
        {
            deleteFile(targeturlFile[i]);
        }
        //执行缩略图
        File[] beforFile = (new File(sourceurl)).listFiles(); // 获取源文件夹当前下的文件或目录
        for (int i = 0; i < beforFile.length; i++)
        {

            if (beforFile[i].isFile()) // 复制文件
            {
                String filename= beforFile[i].getName();
                String name =filename.substring(0,beforFile[i].getName().lastIndexOf("."));
                String type =filename.substring(beforFile[i].getName().lastIndexOf(".") + 1);
                if (name.endsWith("0")){
                    System.out.println(type+"-------"+name);
                    copyFile(beforFile[i], new File(sourceurl + name+"-1."+type));
                }

            }
        }
        File[] file = (new File(sourceurl)).listFiles(); // 获取源文件夹当前下的文件或目录
        ImageToolService imageToolService = new ImageToolService();

        for (int i = 0; i < file.length; i++) {
            if (file[i].isFile()) // 复制文件
            {
                String filename = file[i].getName();
                String name = filename.substring(0, file[i].getName().lastIndexOf("."));
                System.out.println( "---压缩文件----"+name);
                if (name.endsWith("0")) {
                    imageToolService.processImaget(file[i], targeturl, 12);
                } else {
                    imageToolService.processImaget(file[i], targeturl, 22);
                }

            }
        }
        System.out.println("----picYaSuo---结束--------");
    }

    /**
     * 图片识别
     * @param textImgUrl  需要识别图片路径  "C:\\Users\\Administrator\\Desktop\\source\\weixin\\"
     * @param wenbentext 生成文本名称及路径  "C:\\Users\\Administrator\\Desktop\\source\\wenben.txt\\"
     * @throws Exception
     */

//百度云  图片解析，每月1000次解析 https://console.bce.baidu.com/ai/?_=1711280934910&exraInfo=aipe#/ai/ocr/app/detail~appId=4564902
    public static void picTextOcr(String textImgUrl,  String wenbentext) throws Exception{
        // 初始化一个AipOcr
        //首次的时候先清空内容
        File textfile = new File(wenbentext);

        try {
            FileWriter writer = new FileWriter(textfile);
            writer.write(""); // 清空文件内容
            writer.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
        File[] file = (new File(textImgUrl)).listFiles(); // 获取源文件夹当前下的文件或目录
        //清空url2图片
        // deleteFile(new File(url2));
        Map<String ,File  >fileMap=new HashMap<>();
        ArrayList<String> fileNameList=new ArrayList<>();
        for (int i = 0; i < file.length; i++)
        {
            if (file[i].isFile()) // 复制文件
            {
                String filename= file[i].getName();
                String name  =filename.substring(0,file[i].getName().lastIndexOf("."));
                fileNameList.add(name);
                fileMap.put(name,file[i]);

            }
        }
        Collections.sort(fileNameList);//升序排列

        for (int i=0;i<fileNameList.size();i++){

            Thread.sleep(1000);
            String filename=fileNameList.get(i);
            System.out.println("==识别文本文件="+filename);
            String path = fileMap.get(filename).getAbsolutePath();
            AipOcr client = new AipOcr(APP_ID, API_KEY, SECRET_KEY);
            // 可选：设置网络连接参数
            client.setConnectionTimeoutInMillis(2000);
            client.setSocketTimeoutInMillis(60000);
            JSONObject res = client.basicGeneral(path, new HashMap<String, String>());
            System.out.println(res.toString(2));
            FileWriter fw = new FileWriter(wenbentext, true);
            if (filename.endsWith("0")){//表示第一个
                fw.write( "\r\n");
                fw.write( "\r\n");
                fw.write(filename+"\r\n");
                fw.write( "\r\n");
                fw.write( "\r\n");
            }
            JSONArray list= (JSONArray) res.get("words_result");
            if (list!=null){
                for (int k=0;k< list.length();k++){
                    JSONObject fd=list.getJSONObject(k);
                    fw.write(fd.getString("words")+"\r\n");
                }
            }
            fw.write( "\r\n");
            fw.write( "\r\n");
            //循环遍历追加
            fw.close();
        }

     System.out.println("----picTextOcr---结束--------");

    }


    //设置APPID/AK/SK
public static final String APP_ID = "57965434";
public static final String API_KEY = "ICNhJcQ8dKEAEJUXJBQ3b9Xp";
public static final String SECRET_KEY = "v3LTOEmdw2l27SZ6Lk03rat4TSfkMzMi";


    public static void copyFile(File sourceFile, File targetFile) throws IOException
    {
        BufferedInputStream inBuff = null;
        BufferedOutputStream outBuff = null;
        try
        {

            inBuff = new BufferedInputStream(new FileInputStream(sourceFile));
            outBuff = new BufferedOutputStream(new FileOutputStream(targetFile));



            byte[] b = new byte[1024 * 5];
            int len;
            while ((len = inBuff.read(b)) != -1)
            {
                outBuff.write(b, 0, len);
            }

            outBuff.flush();
        }
        finally
        {

            if (inBuff != null)
                inBuff.close();
            if (outBuff != null)
                outBuff.close();
        }
    }
    private static void deleteFile(File file){
        if (file.isFile()){//判断是否为文件，是，则删除
            file.delete();
        }else{//不为文件，则为文件夹
            String[] childFilePath = file.list();//获取文件夹下所有文件相对路径
            for (String path:childFilePath){
                File childFile= new File(file.getAbsoluteFile()+"/"+path);
                deleteFile(childFile);//递归，对每个都进行判断
            }

        }
    }
}